home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
demo.exe
/
KEYS.DEM
< prev
next >
Wrap
Text File
|
1992-02-16
|
9KB
|
323 lines
; ----------------------------
; KEYS.DEM - Demoprogramm für die Routinen aus KEYS.MAB
; (für den A86)
;
; (c) Bernd Schemmer 1990 - 1992
; Letzter Update: 15.02.1992
;
; Übersetzen:
; A86 MACROS.MAC KEYS.MAB KEYS.DEM DEMOS.INC TO KEYS.COM
; ---------------------------
jmp start ; Daten überspringen
logo db CR,LF
db 'KEYS.DEM - Demoprogramm für die Routinen aus KEYS.MAB'
db CR,LF
db '------------------------------------------------------'
db CR,LF
db 'Hinweis: <ALT>-<buchstabe> = Funktionstaste'
db CR,LF
db CR,LF
GETLENGTH logo
msg1 db
db '┌─────────────────────────────────────────────────────────────────────────────┐',CR,LF
db '│ Status der Sondertasten │',CR,LF
db '│ ═══════════════════════ │',CR,LF
db '│ SCROLLLOCK CAPSLOCK NUMLOCK INSERT L-SHIFT R-SHIFT CTRL ALT │',CR,LF
db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
db '│ │',CR,LF
db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
db '│ gedrückte Taste │',CR,LF
db '│ ═══════════════ │',CR,LF
db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
db '│ Scancode (in AX) Funktions-Taste ASCII-Wert Zeichen │',CR,LF
db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
db '│ │',CR,LF
db '╞═════════════════════════════════════════════════════════════════════════════╡',CR,LF
db '│ Bitte Taste(n) drücken, <ESC> für Programmende ... │',CR,LF
db '└─────────────────────────────────────────────────────────────────────────────┘',CR,LF
GETLENGTH msg1
; Offsets der auszufüllenden Felder
SCROLLLOCK_X EQU 10xD
SCROLLLOCK_Y EQU 5
STATUS_DIFF EQU 8
SCANCODE_x EQU 9
SCANCODE_y EQU 12xD
KEY_DIFF EQU 20xD
KEY_DIFF1 EQU 13xD
msgStart dw ? ; Offset des ersten Zeichens von msg im
; Bildschirmspeicher
Scancode dw 0 ; Scancode der gedrückten Taste
OldStatus db 0ffH ; Status der Sondertasten
aktpage db 0 ; akt. Bildschirmseite
start:
mov ah,0Fh
int 010h
mov aktpage,bh ; akt. Bildschirmseite ermitteln
mov ax,0700h
mov cx,0
mov dx,24xD by 79xD
mov bh,07h
int 010h ; Bildschirm löschen
mov dx,0
mov bh,aktpage
mov ah,02
int 010h ; Cursor setzen
mov cx,logo_length
mov si,offset logo
call WriteInt10h ; Logo ausgeben
mov bh,aktpage
mov ah,03h
int 010h ; Cursor-Position ermitteln
mov msgstart,dx ; und sichern
mov cx,msg1_LENGTH
mov si,offset msg1
call writeInt10h ; Maske ausgeben
MainLoop: ; Status der Sondertasten eintragen
mov dx,msgstart
add dl,67xD
add dh,14xD
mov ah,02h
int 010h ; Cursor setzen
keypressed
jnz >l1 ; Taste gedrückt
GetKBDStatus
cmp al,OldStatus
jz MainLoop ; keine Veränderungen eingetreten
mov OldStatus,al
l1:
mov dx,msgstart
add dx,SCROLLLOCK_Y by SCROLLLOCK_X
; Status der Sondertasten ausgeben
mov bl,'N'
ScrollLockAktiv?
if nz mov bl,'J'
call ShowStatus
mov bl,'N'
CapsLockAktiv?
if nz mov bl,'J'
call ShowStatus
mov bl,'N'
NumLockAktiv?
if nz mov bl,'J'
call ShowStatus
mov bl,'N'
InsertAktiv?
if nz mov bl,'J'
call ShowStatus
mov bl,'N'
LeftShiftPressed?
if nz mov bl,'J'
call ShowStatus
mov bl,'N'
RightShiftPressed?
if nz mov bl,'J'
call ShowStatus
mov bl,'N'
CtrlPressed?
if nz mov bl,'J'
call SHowStatus
mov bl,'N'
AltPressed?
if nz mov bl,'J'
call ShowStatus
Inkey ; Testen, ob eine Taste gedrückt wurde
if z jmp MainLoop ; keine Taste gedrückt
; Taste gedrückt, AX = Tastencode
mov Scancode,ax ; AX sichern
; Werte der Taste ausgeben
mov dx,msgstart
add dx,SCANCODE_y BY SCANCODE_x
mov bh,aktpage
mov ah,02h
int 010h ; Cursor setzen
mov ax,Scancode
call ShowScancode ; SANCODE eintragen
add dl,KEY_DIFF
mov bh,aktpage
mov ah,02h
int 010h ; Cursor setzen
mov ax,Scancode
mov bl,'N' ; auf Funktionstaste testen
FunctionKey?
jnz IsNoFunctionKey
mov bl,'J' ; ist eine Funktionstaste
mov Scancode,0
IsNoFunctionkey:
mov al,bl ; J oder N ausgeben
mov bl,070h
mov cx,1
mov ah,09h
int 010h
; ASCII-Wert eintragen
add dl,KEY_DIFF1
mov bh,aktpage
mov ah,02h
int 010h ; Cursor setzen
; SCANCode ausgeben
mov ax,Scancode
call ShowASCIICode
add dl,KEY_DIFF1+3
mov bh,aktpage
mov ah,02h
int 010h ; Cursor setzen
; und zugerhöriges Zeichen ausgeben
mov al, b Scancode
mov bl,070h
cmp Scancode,0
jnz >l1
mov al,BLANK ; für Funktionstasten löschen
mov bl,07h
l1:
mov cx,1
mov ah,09h
int 010h
mov ax,SCANCode
cmp al,ESC ; ESC gedrückt?
je Ende ; ja, Ende
MainLoop0:
jmp Mainloop
Ende:
mov dx,24xD by 0xD
mov bh,aktpage
mov ah,02
int 010h ; Cursor setzen
EndProcess 0 ; und Programm beenden
; ----------------------------
; ShowSCANCode
;
; Funktion: Eintragen des SCANCodes in die Maske
;
; Eingabe: AX = Scancode
;
s0004 db '????h'
s0005 EQU $ - Offset s0004
ShowSCANCode:
mov di,offset s0004
mov si,di
call Konvert_AX_To_Hexstring
mov cx,s0005
call WriteInt10h
ret
; ----------------------------
; ShowASCIICode
;
; Funktion: Eintragen des ASCII-Codes in die Maske
;
; Eingabe: AX = SCANCode
;
s000 db '???xD, '
s001 db '??h'
s002 EQU $ - Offset s000
s003 db ' '
ShowASCIICode:
or ax,ax
jnz >l1
mov si,offset s003 ; für Funktionstasten löschen
jmp >l2
l1:
push ax
mov di,offset s000
call Konvert_AL_To_Dezstring
pop ax
mov di,offset s001
call Konvert_AL_To_Hexstring
mov si,offset s000
l2:
mov cx,s002
call WriteInt10h
ret
; ----------------------------
; ShowStatus
;
; Funktion: Schreibt den akt. Status in die Maske
;
; Eingabe: BL = Wert (J oder N)
; DX = Cursorposition
;
; AUsgabe: DL um STATUS_DIFF erhöht
;
ShowStatus:
; Cursor setzen
mov bh,aktpage
mov ah,02h
int 010h
; und Wert in Maske eintragen
mov al,bl
mov bl,070h
mov cx,1
mov ah,09h
int 010h
add dl,STATUS_Diff ; DL korrigieren
ret
; ----------------------------
; WriteInt10h
;
; Funktion: Ausgabe einer Zeichenkette über die Funktion 0Eh des
; Interrupt 10h
;
; Eingabe: CX = Länge der Zeichenkette
; SI = Offset der Zeichenkette
;
WriteInt10h:
l0:
push cx
lodsb
mov ah,0Eh
int 010h
pop cx
loop l0
ret